其他
React组件封装实践:如何拆解复杂的页面
阿里妹导读
在日常开发中,遇到非常难以维护的页面是常态,相信不少同学也为此苦恼过,笔者在业务开发中总结了些经验希望对大家有所启发。(后台回复大数据即可获得《大数据&AI实战派》电子书)
背景
如何重构,以拆解复杂页面
如果是某一个业务概念比较复杂造成的大量 if-else 嵌套,使用策略模式重构;
如果是多个业务概念交织造成的复杂度,则用责任链模式梳理好每个层次;
如果是更高的抽象层次,比如不同的业务身份有不同的执行链路,或者不同的业务身份都要做某件事但做法不同,那么最好使用模板方法设计模式定义好高层次的业务抽象和默认逻辑,不同的业务身份进行选择性的重写或业务逻辑扩展。
组件化
基础组件:具有一定业务属性的小型组件单元。它有业务属性,但比较弱,强调通用性。
区块组件:业务知识较重的大组件。它内聚了很多业务知识,通用性弱,甚至可以没有通用性,强调业务的内聚性。
组件封装实践
基础组件:AliTalk IM
AliTalk IM 组件定义
type ChatProps = {
uid?: string;
};
const Chat: FC<ChatProps> = (data: ChatProps) => {
const [showChat, setShowChat] = useState(true);
useEffect(() => {
console.log('init Alitalk: ' + data.uid);
return () => {
console.log('destroy Alitalk: ' + data.uid);
setShowChat(false);
const aliTalkMessageBox = document.getElementsByClassName('weblite-iframe');
for (let i = 0; i < aliTalkMessageBox.length; i++) {
const item = aliTalkMessageBox[i];
item.remove();
}
};
}, []);
return (
<div>
{showChat && (
<Alitalk uid={data.uid} pid={'xx'} bizType={1} bizId={'xx'} >
<img width={24} height={24}
src={
'https://img.alicdn.com/imgextra/i2/O1CN01acXzMG1d5JsurHGVR_!!6000000003684-2-tps-200-200.png'
} />
<span style={{ marginLeft: '5px', color: '#FF6600' }}>chat now</span>
</Alitalk>
)}
</div>
);
};
export default Chat;
AliTalk IM 组件定义组件引用
<Descriptions style={{ marginBottom: 24 }} title="买家信息">
<Descriptions.Item label="买家旺旺">
<Chat uid={detailData?.data?.buyerAliTalkId} />
</Descriptions.Item>
</Descriptions>
区块组件:操作栏行动点弹窗
弹窗组件定义
弹窗组件引用
<Fragment>
<Button.Group>
<EstimatedQuotationModalForm orderId={detailData?.id} />
<DomesticWarehouseReceivingModalForm orderId={detailData?.id} />
<OfficialQuotationModalForm orderId={detailData?.id} />
<MarkOrderPaidModalForm orderId={detailData?.id} />
<MarkOrderExceptionModalForm orderId={detailData?.id} />
<MarkOrderClosedModalForm orderId={detailData?.id} />
{/* 移交服务单 ModalForm */}
<TransferOrderModalForm orderId={detailData?.id} />
</Button.Group>
</Fragment>
按照组件拆分后,主页面的代码行数从几千行降低到 200 行,主页面仅仅只做了对其他组件的引用和页面编排,其引用的业务区块组件如果够复杂,还能继续再次拆分组件,整个页面就成了一个挂载的组件树,但每个区块都只关心自己的业务抽象层次,符合 SLAP 原则。
组件封装的思考
关于组件设计思想
关于前后端思想上的融会贯通
阿里云开发者社区,千万开发者的选择
阿里云开发者社区,百万精品技术内容、千节免费系统课程、丰富的体验场景、活跃的社群活动、行业专家分享交流,欢迎点击【阅读原文】加入我们。